package com.tianji.aigc.agent;

import com.tianji.aigc.domain.vo.ChatEventVO;
import com.tianji.aigc.enums.AgentTypeEnum;
import org.springframework.ai.chat.client.advisor.api.Advisor;
import reactor.core.publisher.Flux;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;

public interface Agent {
    /**
     * 表示空参数的工具预定义数组
     */
    Object[] EMPTY_TOOLS = {};

    /**
     * 1、普通聊天
     * @param question 问题
     * @param sessionId 会话ID
     * @return
     */
    String chat(String question, String sessionId);

    /**
     * 2、流式聊天
     * @param question 问题
     * @param sessionId 会话ID
     * @return
     */
    Flux<ChatEventVO> streamChat(String question, String sessionId);

    /**
     * 3、停止聊天
     * @param sessionId 会话ID
     */
    void stop(String sessionId);

    /**
     * 4、大模型提示词
     * @return 提示词
     */
    default String systemMessage(){return "";}

    /**
     * 5、大模型提示词动态参数
     * @return 动态参数Map
     */
    default Map<String, Object> systemMessageParams(){
        return Map.of();
    };

    /**
     * 6、大模型增强器
     * @return 动态参数Map
     */
    default List<Advisor> advisors(){
        return List.of();
    }

    /**
     * 7、大模型增强器参数
     * @return 动态参数Map
     */
    default Map<String, Object> advisorParams(String sessionId){
        return Map.of();
    };

    /**
     * 8、大模型外部工具
     * @return 工具数组
     */
    default Object[] tools(){
        return EMPTY_TOOLS;
    }

    /**
     * 9、大模型外部工具参数
     * @return 工具参数
     */
    default Map<String, Object> toolContext(String requestId){
        return Map.of();
    };

    /**
     * 10、获取智能体类型
     * @return
     */
    AgentTypeEnum getAgentType();

}
